package br.edu.ufcg.nokia.battleship;

import java.io.Serializable;

import br.edu.ufcg.nokia.battleship.excecoes.LimiteTabuleiroExcedidoException;
import br.edu.ufcg.nokia.battleship.excecoes.NavioSobrepostoException;

/**
 * Classe abstrata que representa um jogador generico do batalha naval.
 * @author Miguel Queiroga, Jackson Azevedo, Edmilson Almeida, Jose Luis
 * @version 1.0
 */

public abstract class Jogador implements Comparable, Serializable{
	
	//Este jogador possui seu proprio tabuleiro
	protected Tabuleiro meuTabuleiro;
	protected int pontos = 0;
	protected String nome = "";
	
	/**
	 * O jogador utiliza esse metodo para dispor um dos seus navios no
	 * seu tabuleiro. 
	 * @param x A coordenada X de seu tabuleiro onde deseja por o navio.
	 * @param y A coordenada Y de seu tabuleiro onde deseja por o navio.
	 * @param orientacao Orientacao do navio. <tt>true</tt> significa vertical
	 * e <tt>false</tt> significa horizontal.
	 * @param tipo o tipo do navio, podendo ser: Navio.FRAGATA, Navio.DESTROIER,
	 * Navio.ENCOURACADO, Navio.PORTA_AVIOES, Navio.SUBMARINO 
	 */
	
	public boolean arrumaNavio(int x, int y, boolean orientacao, int tipo) throws NavioSobrepostoException,
		LimiteTabuleiroExcedidoException{
			
		return this.meuTabuleiro.adicionaNavio(x, y, orientacao, tipo);
	}
	/**
	 * Responsavel pelo ataque ao tabuleiro do oponente. 
	 * @param x A coordenada X do tabuleiro do oponente onde se deseja atacar.
	 * @param y A coordenada Y do tabuleiro do oponente onde se deseja atacar.
	 * @param outroTabuleiro uma referencia ao tabuleiro do oponente.
	 * @return <tt>0</tt> se tentou atacar uma regiao ja atacada, <tt>1</tt> se a regiao atacada correspondia a 
	 * agua e <tt>2</tt> se na regiao atacada encontrava-se alguma embarcacao.
	 */

	public byte ataca(int x, int y, Tabuleiro outroTabuleiro){
		
		byte retorno = 1;
		if(outroTabuleiro.getConteudo(x,y)>0){
			if (outroTabuleiro.getConteudo(x,y)>1) retorno = 2; 
			outroTabuleiro.setConteudo(x,y,outroTabuleiro.getConteudo(x,y)*(-1));
			if(retorno == 2) pontos += 6;
			if(retorno == 1) pontos -= 1;
			return retorno;
		}else{
			retorno = 0;
			return retorno;
		}
	}
	/**
	 * Retorna a pontuacao do jogador,
	 * que pode ser no maximo 100 se ele nao acertar nenhuma agua
	 * @return pontos os pontos do jogador
	 */
	public int mostraPontuacao(){
		return pontos;
	}
	/**
	 * Reinicia a pontuacao do jogador
	 *
	 */
	public void reiniciaPontuacao(){
		this.pontos = 0;
	}
	
	/**
	 * Compara dois jogadores
	 * @return Retorna 0 se a pontuacao dos dois jogadores forem iguais, 
	 * menor que 0 se a pontuacao do jogador passado como parametro for maior que 
	 * a desse jogador, e maior que 0 caso contrario; 
	 */
	
	public int compareTo(Object o) {
		if (o instanceof Jogador)
			return mostraPontuacao() - ((Jogador)o).mostraPontuacao();
		return -1;
	}
	/**
	 * Retorna o nome desse jogador.
	 * @return O nome desse jogador;
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Altera o nome desse jogador.
	 * @param O novo nome desse jogador;
	 */
	public void setNome(String novoNome) {
		this.nome = novoNome;
	}
}